package edu.ynu.se.xiecheng.achitectureclass.digitalagriculture.component;

import com.alibaba.fastjson.JSONObject;
import edu.ynu.se.xiecheng.achitectureclass.digitalagriculture.utils.OkHttpUtils;

import java.io.IOException;

/**
 * 摄像头数据获取
 * 设计原则:
 * 1. 单一职责原则(SRP) - 该组件只负责摄像头相关的数据获取功能
 * 2. 接口隔离原则(ISP) - 通过独立的方法提供不同的API调用功能
 * 3. 高内聚低耦合 - 组件内部方法紧密关联,对外依赖通过工具类解耦
 */
public class MonitorComponent {

    // 测试用主方法,将测试与业务逻辑分开
    public static void main(String[] args) {
        String token = genToken("1ca7f0ab24ba41b291346347ec30140e");
        System.out.println(token);
    }

    /**
     * 获取图片URL
     * 体现了:
     * 1. 封装变化原则 - 将API调用细节封装在方法内
     * 2. 单一职责原则 - 方法只负责获取图片URL这一功能
     */
    public static String getImagesUrl(String token, String sn) {
        // 使用JSONObject进行数据封装,体现数据封装原则
        JSONObject paramJson = new JSONObject();

        paramJson.put("channelNo", "1");
        paramJson.put("quality", "1");
        paramJson.put("deviceSerial", sn);
        paramJson.put("accessToken", token);

        try {
            // 使用工具类进行HTTP调用,体现依赖倒置原则(DIP)
            String resp = OkHttpUtils.postMap("https://open.ys7.com/api/lapp/device/capture", paramJson);
            JSONObject respJson = JSONObject.parseObject(resp);

            System.out.println(respJson);

            return respJson.getJSONObject("data").getString("picUrl");
        } catch (IOException e) {
            // 统一的异常处理,体现了异常处理的设计原则
            throw new RuntimeException(e);
        }
    }

    /**
     * 生成Token
     * 体现了:
     * 1. 开闭原则(OCP) - 通过参数传递实现功能扩展
     * 2. 最少知识（迪米特）原则 - 只暴露必要的参数
     */
    public static String genToken(String accountId) {
        JSONObject paramJson = new JSONObject();
        paramJson.put("accountId", accountId);

        try {
            // 通过工具类实现HTTP调用,体现了代码复用原则
            String resp = OkHttpUtils.postJsonHead("http://42.193.14.241:7000/ysapi/subAccount/getToken", paramJson, "");
            System.out.println(resp);
            JSONObject respJson = JSONObject.parseObject(resp);

            return respJson.getJSONObject("data").getString("accessToken");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}